package accesoRepositorio;
import interfacesRemotas.InterfazRestaurante;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;

import modelo.*;

import modelo.gestionReserva.Mesa;


/**
 * @version 1.0
 * @created 21-mar-2007 23:14:46
 */
public class AccesoRestaurante extends UnicastRemoteObject
implements InterfazRestaurante
{


	/**
	 * 
	 */
	private static final long serialVersionUID = 3821657479492854714L;

	public AccesoRestaurante() throws RemoteException
	{
		super();
	}
	/**
	 * Este método devuelve la lista con todas las mesas de un restaurante
	 * @param idRestaurante
	 * @return ListaMesas
	 */
	public List<Mesa> getMesas(int idRestaurante)
	{
		ConexionBD bd=new ConexionBD();
		java.sql.ResultSet rs=null;
		int idMesa=0;
		Mesa mesa;
		List<Mesa> listaMesas = new LinkedList<Mesa>();
		AccesoMesa am;
		
		if(!bd.abrir())
			return null;
		rs=bd.select("SELECT num_mesa FROM Mesa WHERE id_restaurante="+idRestaurante+";");
		if(rs==null)
			{
			bd.cerrar();
			return null;
			}
		
		try {
			am = new AccesoMesa();
			while(rs.next())
				{
				//Recuperamos los datos de una mesa
				idMesa=rs.getInt("num_mesa");
				mesa=am.getMesa(idMesa);
				listaMesas.add(mesa);	
				}
		} catch (SQLException e) {
			System.err.println("Error en recuperar mesas de un restaurante: "+e.getMessage());
			bd.cerrar();
			return null;
		} catch (RemoteException r)
		{
			System.err.println("Exception Remota producida en clase AccesoRestaurante metodo getMesas : " + r.getMessage());
		}
		bd.cerrar();
		return listaMesas;
	}
	
	/**
	 * Este método devuelve la lista con todas las mesas de un restaurante
	 * @param idRestaurante
	 * @return ListaMesas
	 */
	public List<Mesa> getMesasLibres(int idRestaurante)
	{
		ConexionBD bd=new ConexionBD();
		java.sql.ResultSet rs=null;
		int idMesa=0;
		Mesa mesa;
		List<Mesa> listaMesas = new LinkedList<Mesa>();
		AccesoMesa am;
		
		if(!bd.abrir())
			return null;
		rs=bd.select("SELECT num_mesa FROM Mesa WHERE id_restaurante="+idRestaurante+
				" AND estado="+"'libre';");
		if(rs==null)
			{
			bd.cerrar();
			return null;
			}
		
		try {
			am = new AccesoMesa();
			while(rs.next())
				{
				//Recuperamos los datos de una mesa
				idMesa=rs.getInt("num_mesa");
				mesa=am.getMesa(idMesa);
				//OJO! No debo meter en la lista mesas nulas
				if(mesa!=null)
					listaMesas.add(mesa);	
				}
		} catch (SQLException e) {
			System.err.println("Error al recuperar mesas libres de un restaurante: "+e.getMessage());
			bd.cerrar();
			return null;
		} catch (RemoteException r)
		{
			System.err.println("Exception Remota producida en clase AccesoRestaurante metodo getMesasLibres : " + r.getMessage());
		}
		bd.cerrar();
		return listaMesas;
	}
	/**
	 *
	 * @param id_restaurante
	 * @deprecated este método no debe ser usado, hay que usar el siguiente
	 */
	public Restaurante getRestaurante(int id_restaurante){
	  	    ConexionBD m_ConexionBD;
		    m_ConexionBD = new ConexionBD();
		    m_ConexionBD.abrir();


		    ResultSet rs;
            Restaurante m_Restaurante;

            rs = (ResultSet)m_ConexionBD.select("SELECT * FROM Restaurante WHERE id_restaurante ="+id_restaurante);

            try{
            	rs.next();
            	m_Restaurante=new Restaurante(
            				id_restaurante,
            				rs.getString("nombre_restaurante"),
            				rs.getString("CIF"),
            				rs.getString("direccion"),
            				rs.getInt("telefono"));
            }catch(Exception e){
            	System.out.println(e);
            	m_ConexionBD.cerrar();
            	return null;
            }

            m_ConexionBD.cerrar();

            return m_Restaurante;
	}
	/**
	 *	Metodo que nos devuelve los datos del restaurante en un array de objetos.
	 * Este metodo es una alternativa correcta al metodo anterior.  
	 * @param id_restaurante
	 */
	public Object[] recuperarRestaurante(int id_restaurante) throws RemoteException
	{
		Object[] arrayDatos = {null,null,null,null};
		ConexionBD m_ConexionBD;
		m_ConexionBD = new ConexionBD();
		m_ConexionBD.abrir();
		ResultSet rs;

		rs = (ResultSet) m_ConexionBD
				.select("SELECT * FROM Restaurante WHERE id_restaurante ="
						+ id_restaurante);

		try {
			rs.next();
			
			arrayDatos[0]=rs.getString("nombre_restaurante");
			arrayDatos[1]=rs.getString("CIF");
			arrayDatos[2]=rs.getString("direccion");
			arrayDatos[3]=rs.getInt("telefono");
		} catch (Exception e)
		{
			System.err.println(e);
			m_ConexionBD.cerrar();
			return null;
		}

		m_ConexionBD.cerrar();

		return arrayDatos;
	}



	/**
	 * 
	 * @param id_restaurante
	 * @param nombre
	 * @param CIIF
	 * @param Telf
	 * @param dir
	 */
	public boolean updateRestaurante(int id_restaurante, String nombre, String CIF, String Telf, String dir)
	{
  	    ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();

	    boolean retVal = m_ConexionBD.update("UPDATE Restaurante SET"+
                                 " nombre='"+nombre+
                                 "', direccion='"+dir+
                                 "' WHERE id_restaurante="+id_restaurante);

	    m_ConexionBD.cerrar();

	    return retVal;
	}

	/**
	 *
	 * @param nombre
	 * @param CIF
	 * @param Telf
	 * @param dir
	 */
	public boolean insertRestaurante(String nombre, String CIF, String Telf, String dir)
	{
		ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();

		int id_restaurante = m_ConexionBD.generaId("Restaurante","id_restaurante");

		boolean retVal = m_ConexionBD.update("INSERT INTO Restaurante VALUES("
                                +id_restaurante
                                +",'"+nombre
                                +"','"+dir
                                +"',"+Telf
                                +",'"+CIF
                                +"')");

		m_ConexionBD.cerrar();

		return retVal;
	}

	/**
	 *
	 * @param id_restaurante
	 */
	public void deleteRestaurante(int id_restaurante)
	{
  	    ConexionBD m_ConexionBD;
	    m_ConexionBD = new ConexionBD();
	    m_ConexionBD.abrir();

		m_ConexionBD.update("DELETE FROM Restaurante " +
                            "WHERE id_restaurante="+id_restaurante);

		m_ConexionBD.cerrar();
	}
	
}